/**
* 根据输出结果可以看到
* 本题是按照之字形路线赋值
* zigzag(JPEG编码取像素数据的排列顺序)
**/
#include <stdio.h>
#include <stdlib.h>

/**
* 我自己写的
* 利用循环按照递增路径走
**/
void my(int n, int **a)
{
  int i,j,k,jo;
  i = j = k = 0;
  jo = n % 2; // 奇数为1,偶数为0
  
  a[i][j] = k++;
  while (1) {
    if (jo == 1 && j == n-1) {
      break; // 如果是奇数则,此位置退出
    }
    
    for (j++ ;; i++,j--) {
      a[i][j] = k++;
      if (j == 0) {
        break;
      }
    }
    
    if (jo == 0 && i == n-1) {
      break; // 如果是偶数则,此位置退出
    }
    
    for (i++ ;; i--,j++) {
      a[i][j] = k++;
      if (i == 0) {
        break;
      }
    }
  }
  
  if (jo == 1) { // 奇数一半是右上角
    while (i < n-1 || j < n-1) {
      for (i++ ;; i++,j--) {
        a[i][j] = k++;
        if (i == n-1) {
          break;
        }
      }
      
      for (j++ ;; i--,j++) {
        a[i][j] = k++;
        if (j == n-1) {
          break;
        }
      }
    }
  } else { // 偶数一半是左下角
    while (1) {
      for (j++ ;; i--,j++) {
        a[i][j] = k++;
        if (j == n-1) {
          break;
        }
      }
      
      if (i == n-1 && j == n-1) {
        break;
      }
      
      for (i++ ;; i++,j--) {
        a[i][j] = k++;
        if (i == n-1) {
          break;
        }
      }
    }
  } // end
}

/**
* 妈的一开始公式都看不懂
* 研究了一下，真的看不懂
* 不怎么好理解啊！
**/
void answer(int n, int **a)
{
  int s,i,j,squa = n*n;
  
  for (i=0;i<n;i++) {
    for (j=0;j<n;j++) {
      s = i+j;
      if (s < n) {
        a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0) ? i : j);
      } else {
        s = (n-1-i) + (n-1-j);
        a[i][j] = squa - s*(s+1)/2 - (n-(((i+j)%2 == 0) ? i : j));
      }
    }
  }
}

int main(int argc, char *argv[])
{
  int i,j,n;
  scanf("%d", &n);
  
  int **a = (int **)malloc(n * sizeof(int));
  if (a == NULL) {
    return -1;
  }
  
  for (i = 0;i < n;i++) {
    if ( (a[i] = (int *)malloc(n * sizeof(int))) == NULL ) {
      while (--i >= 0) {
        free(a[i]);
      }
      free(a);
      return -1;
    }
  }
  
  for (i=0;i<n;i++) {
    for (j=0;j<n;j++) {
      a[i][j] = 0; // 初始化值
    }
  }
  my(n, a); // 我的答案,下面打印结果
  for (i=0;i<n;i++) {
    for (j=0;j<n;j++) {
      printf("%4d", a[i][j]);
    }
    printf("\n");
  }
  
  printf("\n");
  
  for (i=0;i<n;i++) {
    for (j=0;j<n;j++) {
      a[i][j] = 0; // 初始化值
    }
  }
  answer(n, a); /* pdf的答案 */
  for (i=0;i<n;i++) {
    for (j=0;j<n;j++) {
      printf("%4d", a[i][j]);
    }
    printf("\n");
  }
  
  return 0;
}
